테인트, 톨러레이션

개요

스케줄링 중 필터링 단계 해당하는 설정 기법 중 하나이다.
테인트는 노드에 남기는 얼룩(taint)을 말한다.
테인트가 걸리면 아무런 파드가 노드에 배치될 수 없도록 필터링이 걸린다.
파드가 해당 노드에 배치되고 싶다면 해당 얼룩을 용인(toleration)할 수 있도록 명시적으로 설정을 해줘야만 한다.

보통 마스터 노드에는 일반 파드가 배치되지 않는데, 그 이유가 바로 마스터 노드 관련 테인트가 걸려 있기 때문이다.
또한 노드를 드레인할 때 역시, 노드에 얼룩을 남김으로써 파드들이 더 이상 스케줄링되지 못하도록 막게 된다.

미리 말하지만, 테인트는 스케줄링에서만 활용되는 게 아니라 이미 존재하는 파드를 축출시키는 것도 가능하다.

테인트 효과

노드에 거는 테인트는 크게 세 가지 효과를 설정할 수 있다.

보다시피 이 효과들은 단계적으로 강화된다.

사용법

kubectl taint nodes node1 key1=value1:NoSchedule

사용법은 굉장히 간단하다.
그냥 어떤 노드에 테인트라고 해서 키=값:효과를 적어주면 된다.
같은 키값에 다른 효과를 넣는 것도 가능은 한데, 어차피 NoExecute는 NoSchedule까지 포함하니 굳이 그렇게 사용은 안 한다.

kubectl taint nodes node1 key1=value1:NoSchedule-

없앨 때는 마이너스를 끝에 붙인다.

그렇다면 파드에서 이 얼룩을 용인하려면 어떻게 해야 하는가?

tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"
---
tolerations:
- key: "key1"
  operator: "Exists"
  effect: "NoSchedule"

이것도 간단하게, 그저 파드 스펙에 tolerations를 작성하고 어떤 키에 대해 어떤 효과를 용인할지 지정하면 된다.
effect에 단순히 ""를 넣으면 모든 효과들이 용인된다.

tolerations:
- key: "key1"
  operator: "Exists"
  effect: "NoExecute"
  tolerationSeconds: 3600

NoExecute를 용인한 파드는 해당 노드에서 종료되지 않는다.
다만 tolerationSeconds를 지정하면 이 언제까지 용인을 할지 지정할 수 있고, 이 시간을 넘겨서도 노드에 테인트가 있다면 해당 파드도 얄짤 없이 날아간다.

노익시 허용 파드가 노스케 노드에 배치되나?

기본 테인트

쿠버네티스에는 기본적으로 설정되는 테인트가 여러 종류 있다.
이것들은 노드 컨트롤러가 노드의 상태를 보고 건다.
다음은 특정 상황에 세팅되는 테인트이다.

tolerations:
- key: "node.kubernetes.io/unreachable"
  operator: "Exists"
  effect: "NoExecute"
  tolerationSeconds: 6000

실제 파드들을 뜯어보면 보통 이런 값이 있는 것을 볼 수 있다.
이건 승인 제어 단계에서 알아서 주입된 값으로, 노드와의 통신에 잠시 문제가 생겨도 바로 퇴출당하지 않도록 막는다.

노드가 드레인된다고 하면 not-ready, unreachable 두 테인트가 걸린다.
데몬셋의 경우 해당 테인트에 대해 시간 제한 없이 용인하도록 세팅이 돼있어 항상 유지된다.
이건 데몬셋이 보통 노드를 관리하는 어플리케이션을 배치하는데 사용되기 때문이다.

관련 문서

이름 noteType created
테인트, 톨러레이션 knowledge 2025-03-19

참고